package com.tmt.asm;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.tmt.asm.service.HelloServiceImpl;
import com.tmt.asm.service.IHelloService;

/**
 * 如果只是接口没有实现类，则没有执行反射操作 感觉这种方式更好一点。
 * 
 * @author lifeng
 */
public class TestJdkProxy {

	public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException {

		// 生成$Proxy0的class文件
		System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

		// --- 一般使用這種方式
		IHelloService ihello = (IHelloService) Proxy.newProxyInstance(IHelloService.class.getClassLoader(), // 加载接口的类加载器
				new Class[] { IHelloService.class }, // 一组接口
				new HWInvocationHandler(new HelloServiceImpl())); // 自定义的InvocationHandler
		ihello.sayHello();
	}
}

/**
 * 代理拦截器
 * 
 * @author lifeng
 */
class HWInvocationHandler implements InvocationHandler {
	// 目标对象
	private Object target;

	public HWInvocationHandler(Object target) {
		this.target = target;
	}

	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("------插入前置通知代码-------------");
		// 执行相应的目标方法
		Object rs = method.invoke(target, args);
		System.out.println("hello 输出：" + rs);
		System.out.println("------插入后置处理代码-------------");
		return rs;
	}
}